/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function (n, k) {
    let res = [];
    combineLevel(n, k, res, 1, [])
    return res
};

function combineLevel(n, k, res, cur, val) {
    if (val.length === k) {
        res.push([...val])
        return
    }
    for (let i = cur; i <= n; i++) {
        val.push(i)
        combineLevel(n, k, res, i + 1, val)
        val.pop()
    }
}


// i+(k-len)>=n
function combineLevel(n, k, res, cur, val) {
    if (val.length === k) {
        res.push([...val])
        return
    }
    // 剪枝
    for (let i = cur; i <= len + n - k + 1; i++) {
        val.push(i)
        combineLevel(n, k, res, i + 1, val)
        val.pop()
    }
}

// 4 2 0 []
// 4 2 1 [ 1 ]
// 4 2 2 [ 1, 2 ]
// 4 2 3 [ 1, 3 ]
// 4 2 4 [ 1, 4 ]
// 4 2 2 [ 2 ]
// 4 2 3 [ 2, 3 ]
// 4 2 4 [ 2, 4 ]
// 4 2 3 [ 3 ]
// 4 2 4 [ 3, 4 ]
// 4 2 4 [ 4 ]